/*实验一
 * extern void uart_puts(char *s);

void hello_world() {
    uart_puts("Hello, Minimal OS!\n");
}

void start() {
    // 硬件初始化（此处仅需串口）
    // 跳转至用户程序前执行
    hello_world();
    while (1) {} // 死循环防止重启
}*/

/*实验二
// kernel/main.c
#include "types.h"
#include "uart.h"
#include "printf.h"
#include "ansi.h"

// 简单的内存操作函数（裸机环境需要自己实现）
void* memcpy(void* dest, const void* src, size_t n) {
    char* d = (char*)dest;
    const char* s = (const char*)src;
    for (size_t i = 0; i < n; i++) {
        d[i] = s[i];
    }
    return dest;
}

void* memset(void* dest, int c, size_t n) {
    char* d = (char*)dest;
    for (size_t i = 0; i < n; i++) {
        d[i] = (char)c;
    }
    return dest;
}

size_t strlen(const char* s) {
    size_t len = 0;
    while (s[len]) len++;
    return len;
}

// 内核入口点
void kernel_main(void) {
    // 初始化硬件
    uart_init();
    
    // 清屏并显示欢迎信息
    clear_screen();
    set_foreground_color(2);  // 绿色
    printf("=== MyOS Kernel Booted Successfully ===\n\n");
    reset_color();
    
    // 测试基本输出
    printf("Testing basic printf functionality:\n");
    printf("  Integer: %d\n", 42);
    printf("  Negative: %d\n", -123);
    printf("  Hex: 0x%x\n", 0xDEADBEEF);
    printf("  String: %s\n", "Hello, World!");
    printf("  Character: %c\n", 'A');
    printf("  Pointer: %p\n", kernel_main);
    
    // 测试边界情况
    printf("\nTesting edge cases:\n");
    printf("  Zero: %d\n", 0);
    printf("  Max int: %d\n", 2147483647);
    printf("  Min int: %d\n", -2147483648);
    printf("  NULL string: %s\n", NULL);
    
    // 测试颜色
    printf("\nTesting colors:\n");
    for (int i = 0; i < 8; i++) {
        set_foreground_color(i);
        printf("  Color %d: Hello World!\n", i);
    }
    reset_color();
    clear_screen();

    // 测试光标定位
    printf("\nTesting cursor positioning:\n");
    set_cursor_position(15, 10);
    set_foreground_color(1);  // 红色
    printf("This text is at row 15, column 10");
    reset_color();
    //clear_screen();

    // 回到正常位置
    set_cursor_position(18, 0);
    printf("Kernel initialization complete. Ready for commands.\n");
    printf("> ");
    
    // 简单的命令行界面
    char input[128];
    while (1) {
        console_readline(input, sizeof(input));
        printf("You entered: %s\n", input);
        printf("> ");
    }
}*/

//实验三
#include "types.h"
#include "uart.h"
#include "printf.h"
#include "ansi.h"
#include "pmm.h"
#include "test_mem.h"

int main(void)
{
    // 早期初始化
    uart_init();     // 串口初始化
    printf("=== Kernel Starting ===\n");
    //pmm_init();     // 物理内存管理器初始化
    printf("=== PMM Initialized ===\n"); 
    
    // 运行测试
    test_physical_memory();
    test_pagetable(); 
    test_virtual_memory();
    
    printf("All memory management tests passed!\n");
    
    // 进入主循环
    for(;;) {
        asm volatile("wfi"); // 等待中断
    }
}
